package constructor;

/**
 * 可变对象示例
 * 
 * 与不可变对象不同，可变对象的状态可以在创建后被修改。
 * 这种对象通常有setter方法来修改其内部状态。
 */
public class MutableDemo {
    private String name;
    private int age;
    private String email;
    
    /**
     * 构造函数
     * @param name 姓名
     * @param age 年龄
     * @param email 邮箱
     */
    public MutableDemo(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    
    // Getter方法
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
    
    public String getEmail() {
        return email;
    }
    
    // Setter方法 - 这是可变对象的关键特征
    public void setName(String name) {
        this.name = name;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
    
    @Override
    public String toString() {
        return "MutableDemo{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
    
    /**
     * 静态内部类Builder
     * 用于演示Builder模式也可以用来创建可变对象
     */
    public static class Builder {
        private String name;
        private int age;
        private String email;
        
        public Builder() {
        }
        
        public Builder name(String name) {
            this.name = name;
            return this;
        }
        
        public Builder age(int age) {
            this.age = age;
            return this;
        }
        
        public Builder email(String email) {
            this.email = email;
            return this;
        }
        
        public MutableDemo build() {
            return new MutableDemo(name, age, email);
        }
    }
    
    /**
     * 主方法，演示可变对象的使用
     */
    public static void main(String[] args) {
        System.out.println("=== 可变对象示例 ===\n");
        
        // 创建对象
        MutableDemo person = new MutableDemo("张三", 25, "zhangsan@example.com");
        System.out.println("1. 初始状态:");
        System.out.println(person);
        System.out.println();
        
        // 修改对象状态
        System.out.println("2. 修改对象状态:");
        person.setName("李四");
        person.setAge(30);
        person.setEmail("lisi@example.com");
        System.out.println("修改后:");
        System.out.println(person);
        System.out.println();
        
        // 通过引用修改对象
        System.out.println("3. 通过方法修改对象:");
        modifyPerson(person);
        System.out.println("方法调用后:");
        System.out.println(person);
        System.out.println();
        
        // 展示引用共享问题
        System.out.println("4. 引用共享问题:");
        MutableDemo anotherPerson = person; // 指向同一个对象
        anotherPerson.setAge(35);
        System.out.println("原始对象: " + person);
        System.out.println("另一个引用: " + anotherPerson);
        System.out.println("可以看到，修改通过另一个引用也影响了原始引用");
        System.out.println();
        
        // 使用Builder创建可变对象
        System.out.println("5. 使用Builder创建可变对象:");
        MutableDemo person2 = new MutableDemo.Builder()
                .name("王五")
                .age(28)
                .email("wangwu@example.com")
                .build();
        System.out.println("通过Builder创建的对象: " + person2);
        
        // 验证创建的对象仍然是可变的
        person2.setAge(33);
        System.out.println("修改通过Builder创建的对象后: " + person2);
    }
    
    /**
     * 演示通过引用修改对象
     * @param person 要修改的人对象
     */
    public static void modifyPerson(MutableDemo person) {
        person.setName("王五");
        person.setAge(28);
    }
}